package com.welike.shibo.utils;

import com.alibaba.fastjson.JSONObject;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 通用工具类(时间、字符串转换为主)
 *
 * @author fangyu
 * @version v1.0.0
 * @since 2019-08-19 00:40
 */
public class Tools {

    /**
     * 生成唯一的主键 ==> 16位
     * 格式: 时间+随机数
     * 加synchronized锁确定方法不被并发多线程生成的数重复
     *
     * @return
     */
    public static synchronized String getUniqueKey() {
        Random random = new Random();

        // 生成六位随机数
        Integer number = random.nextInt(900000) + 100000;

        return (System.currentTimeMillis() / 1000) + String.valueOf(number);
    }

    // 生成唯一id
    public synchronized static String generateShortUid() {
        Random random = new Random();
        int First = random.nextInt(9) + 1;
        String currentTime = String.valueOf(System.currentTimeMillis());
//        return currentTime.substring(currentTime.length()-11, currentTime.length()-1);
        return First + currentTime.substring(currentTime.length() - 8, currentTime.length() - 1);
    }

    /**
     * 使用正则表达式校验手机号码
     *
     * @param phone
     * @return
     */
    public static boolean isMobile(String phone) {
        String regex = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(phone);
        return matcher.matches();
    }


    /**
     * 生成六位登录随机验证码
     *
     * @return int
     */
    public static int generateSmsCode() {
        return (int) ((Math.random() * 9 + 1) * 100000);
    }

    /**
     * 判断 一个字符串的值是否为空
     *
     * @param s 字符串
     * @return boolean
     */
    public static boolean isNull(String s) {
        // 如果字符串的随便一个判断为空, 则返回True  == equalsIgnoreCase => 忽略大小写equals
//        if (null == s || "".equals(s) || "null".equalsIgnoreCase(s)) {
//            return true;
//        }
//        return false;
        // 简化写法
        return null == s || "".equals(s) || "null".equalsIgnoreCase(s);
    }

    /**
     * 获取当前年月(格式: 201912)
     *
     * @return String
     */
    public static String getYearMonth() {
        // 获取当前的时间
        Calendar calendar = Calendar.getInstance(Locale.CHINA);
        Date date = calendar.getTime();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        return dateFormat.format(date);
//        int year = calendar.get(Calendar.YEAR);
//        int month = calendar.get(Calendar.MONTH);
//        return year + "" + month;
    }

    /**
     * 获取当前中国时区的时间(格式: yyyy-MM-dd HH:mm:ss)
     *
     * @return String类型的时间
     */
    public static String newDate() {
        // 获取当前时间(指定中国时区)
        Calendar calendar = Calendar.getInstance(Locale.CHINA);
        Date date = calendar.getTime();
        // new 一个时间日期转换类, 并指定日期格式
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 时间转换为指定格式, 并return
        return dateFormat.format(date);
    }

    /**
     * Java将Unix时间戳转换成指定格式时间字符串
     *
     * @param timestampString String类型时间戳, 如: "1473048265";
     * @param formats         要格式化的格式 默认: "yyyy-MM-dd HH:mm:ss";
     * @return String 时间字符串 如: "2019-08-19 00:59:14";
     */
    public static String TimeStamp2Date(String timestampString, String formats) {
        // 如果转换格式为null, 则指定转换格式
        if (isNull(formats)) {
            formats = "yyyy-MM-dd HH:mm:ss";
        }
        // 将String类型的秒时间戳 转换为 Long类型的毫秒时间戳
        long timestamp = Long.parseLong(timestampString) * 1000;
        // 讲 Long类型时间戳转换为 指定格式 并返回
        return new SimpleDateFormat(formats, Locale.CHINA).format(new Date(timestamp));
    }

    /**
     * Java将Unix时间戳转换成年月日(yyyy-MM-dd)
     *
     * @param timestampString String类型时间戳, 如: "1473048265";
     * @return String 日期字符串 如: "2019-08-19"
     */
    public static String TimeStampDate(long timestampString) {
        try {
            // 以秒为单位的时间戳(10位) => 以毫秒为单位的时间戳(13位)
            long timestamp = timestampString * 1000;
            //
            String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(new Date(timestamp));
            // 判断 时间是否为空并且 时间的长度 > 0
            if (!Tools.isNull(date) && date.length() > 0) {
                date = date.substring(0, 10);
            }
            return date;
        } catch (Exception e) {
            return "";
        }
    }

    /**
     * 将时间转换为时间戳
     *
     * @param str 时间
     * @return 时间戳
     */
    public static long Date2Stamp(String str) {
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = simpleDateFormat.parse(str);
            // 返回的时间戳直接转换为10位秒时间戳
            return date.getTime() / 1000;
        } catch (Exception e) {
            return 0;
        }
    }

    public static String DateFormat(Object date) throws ParseException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String formatDate = "";
        if (date instanceof Date) {
            formatDate = dateFormat.format(date);
        } else if (date instanceof String) {
            return DateFormat(dateFormat.parse(String.valueOf(date)));
        }
        return formatDate;
    }

    /**
     * 获取当前时间戳(精确到秒)
     *
     * @return nowTimeStamp
     */
    public static long getNowTimeStamp() {
        long time = System.currentTimeMillis();
        return time / 1000;
    }

    public static void main(String[] args) throws ParseException {
        System.out.println(Tools.DateFormat("2019-11-25T16:00:00.000Z"));
        System.out.println(Tools.DateFormat(new Date()));
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("key", "2019-11-25T16:00:00.000Z");
        jsonObject.put("key", Tools.DateFormat("2019-11-25T16:00:00.000Z"));
        System.out.println(jsonObject);
    }
}
